package com.floreantpos.util;

import javax.swing.JOptionPane;

public class POSUtil {

  public static boolean isBlankOrNull(String str) {
    if (str == null) {
      return true;
    }
    if (str.trim().equals("")) {
      return true;
    }
    return false;
  }
  
  public static boolean isNumeric(String str) {
    if (str.matches("[0-9]+")) {
      return true;
    }
    return false;
  }
  
  private static Boolean checkRepeatedChars(String param) {
    
    Boolean retVal = false;
    
    int paramChars = param.length() - 1;
    int repeatedChars = 0;
    
    for (int i = 1 ; i <= paramChars ; i++) {
      if (param.charAt(i - 1) == param.charAt(i)) {
        repeatedChars++;
      }
    }
    
    if (paramChars != repeatedChars) {
      retVal = true;
    }
    
    return retVal;
  }
  
  public static String checkTaxId(String param) {
    
    param=param.replace('.',' ');
    param=param.replace('/',' ');
    param=param.replace('-',' ');
    param=param.replaceAll(" ","");
    
    if (isNumeric(param)) {
      if (checkRepeatedChars(param)) {
        if (validaCNPJ(param).equals("*")) {
          if (validaCPF(param).equals("*")) {
            param = "*";          
          } else {
            param = validaCPF(param);
          }
        } else {
          param = validaCNPJ(param);
        }        
      } else {
        param = "*";
      }   
    } else {
      param = "*";
    }
    return param;
  }

  public static String getTaxId() {
    String taxId = "";
    if (JOptionPane.showConfirmDialog(null, "Deseja informar o Documento (CNPJ ou CPF)?", com.floreantpos.POSConstants.MDS_POS, JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE) == JOptionPane.YES_OPTION) {
      Boolean isTaxIdInputValid = false;
      while (!isTaxIdInputValid) {
        taxId = JOptionPane.showInputDialog("Documento (CNPJ ou CPF): ");         
        if (taxId == null) {
          if (JOptionPane.showConfirmDialog(null, "Documento Inválido, Informar Novamente?", com.floreantpos.POSConstants.MDS_POS, JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE) == JOptionPane.NO_OPTION) {
            isTaxIdInputValid = true;
          }
        } else {
          taxId = POSUtil.checkTaxId(taxId);           
          if (taxId.equals("*")) {
            if (JOptionPane.showConfirmDialog(null, "Documento Inválido, Informar Novamente?", com.floreantpos.POSConstants.MDS_POS, JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE) == JOptionPane.NO_OPTION) {
              taxId = "";
              isTaxIdInputValid = true;
            } 
          } else {
            isTaxIdInputValid = true;
          }            
        }          
      }        
    }
    return taxId;
  }  
  
  private static String validaCPF(String strCpf){
      // Source: http://tribotecnologica.com.br/?p=917
      int iDigito1Aux = 0, iDigito2Aux = 0, iDigitoCPF;
      int iDigito1 = 0, iDigito2 = 0, iRestoDivisao = 0;
      String strDigitoVerificador, strDigitoResultado;

      if (!strCpf.substring(0,1).equals("")){
          try{
              for (int iCont = 1; iCont < strCpf.length() -1; iCont++) {
                  iDigitoCPF = Integer.valueOf(strCpf.substring(iCont -1, iCont)).intValue();
                  iDigito1Aux = iDigito1Aux + (11 - iCont) * iDigitoCPF;
                  iDigito2Aux = iDigito2Aux + (12 - iCont) * iDigitoCPF;
              }
              iRestoDivisao = (iDigito1Aux % 11);
              if (iRestoDivisao < 2) {
                  iDigito1 = 0;
              } else {
                  iDigito1 = 11 - iRestoDivisao;
              }
              iDigito2Aux += 2 * iDigito1;
              iRestoDivisao = (iDigito2Aux % 11);
              if (iRestoDivisao < 2) {
                  iDigito2 = 0;
              } else {
                  iDigito2 = 11 - iRestoDivisao;
              }
              strDigitoVerificador = strCpf.substring(strCpf.length()-2, strCpf.length());
              strDigitoResultado = String.valueOf(iDigito1) + String.valueOf(iDigito2);
              if (strDigitoVerificador.equals(strDigitoResultado)) {
                return strCpf.substring(0, 3) + "." + strCpf.substring(3, 6) + "." + strCpf.substring(6, 9) + "-" + strCpf.substring(9, 11);
              } else {
                return "*";
              }
          } catch (Exception e) {
              return "*";
          }
      } else {
          return "*";
      }
  }
  
  private static String validaCNPJ(String strCNPJ) {
      // Source: http://tribotecnologica.com.br/?p=917
      int iSoma = 0, iDigito;
      char[] chCaracteresCNPJ;
      String strCNPJ_Calculado;

      if (!strCNPJ.substring(0,1).equals("")){
          try{
              strCNPJ_Calculado = strCNPJ.substring(0,12);
              if ( strCNPJ.length() != 14 ) return "*";
              chCaracteresCNPJ = strCNPJ.toCharArray();
              for(int i = 0; i < 4; i++) {
                  if ((chCaracteresCNPJ[i]-48 >= 0) && (chCaracteresCNPJ[i]-48 <= 9)) {
                      iSoma += (chCaracteresCNPJ[i] - 48 ) * (6 - (i + 1)) ;
                  }
              }
              for( int i = 0; i < 8; i++ ) {
                  if ((chCaracteresCNPJ[i+4]-48 >= 0) && (chCaracteresCNPJ[i+4]-48 <= 9)) {
                      iSoma += (chCaracteresCNPJ[i+4] - 48 ) * (10 - (i + 1)) ;
                  }
              }
              iDigito = 11 - (iSoma % 11);
              strCNPJ_Calculado += ((iDigito == 10) || (iDigito == 11)) ? "0" : Integer.toString(iDigito);
                 /* Segunda parte */
              iSoma = 0;
              for (int i = 0; i < 5; i++) {
                  if ((chCaracteresCNPJ[i]-48 >= 0) && (chCaracteresCNPJ[i]-48 <= 9)) {
                      iSoma += (chCaracteresCNPJ[i] - 48) * (7 - (i + 1)) ;
                  }
              }
              for (int i = 0; i < 8; i++) {
                  if ((chCaracteresCNPJ[i+5]-48 >= 0) && (chCaracteresCNPJ[i+5]-48 <= 9)) {
                      iSoma += (chCaracteresCNPJ[i+5] - 48) * (10 - (i + 1)) ;
                  }
              }
              iDigito = 11 - (iSoma % 11);
              strCNPJ_Calculado += ((iDigito == 10) || (iDigito == 11)) ? "0" : Integer.toString(iDigito);
              if (strCNPJ.equals(strCNPJ_Calculado)) {
                return strCNPJ.substring(0, 2) + "." + strCNPJ.substring(2, 5) + "." + strCNPJ.substring(5, 8) + "/" + strCNPJ.substring(8, 12) + "-" + strCNPJ.substring(12, 14);
              } else {
                return "*";
              }
          } catch (Exception e) {
              return "*";
          }
      } else return "*";
  }  
}
